package code.oldCode.feishuSpecializedTraining.hash;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;

public class MyHash {
    // 242. 有效的字母异位词
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length())
            return false;
        int len = s.length();
        HashMap<Character, Integer> hashMap = new HashMap<>();
        for (int i = 0; i < len; i++) {
            Character c = s.charAt(i);
            if (!hashMap.containsKey(c)) {
                hashMap.put(c, 1);
            } else {
                hashMap.put(c, hashMap.get(c) + 1);
            }
        }
        for (int i = 0; i < len; i++) {
            Character c = t.charAt(i);
            if (!hashMap.containsKey(c)) {
                return false;
            } else {
                if (hashMap.get(c) == 1) {
                    hashMap.remove(c);
                } else {
                    hashMap.put(c, hashMap.get(c) - 1);
                }
            }
        }
        return true;
    }

    // 349. 两个数组的交集
    public int[] intersection(int[] nums1, int[] nums2) {
        // 用一个set求交集，也可以用两个set手动求交集，重复的放入新的set3中，最后取set3中的所有元素返回
        List<Integer> list = new ArrayList<>();
        HashSet<Integer> hashSet = new HashSet<>();
        for (int num : nums1) {
            hashSet.add(num);
        }
        for (int num : nums2) {
            if (hashSet.contains(num)) {
                list.add(num);
                hashSet.remove(num);
            }
        }
        // 这一步就是将List转为int[]，流操作记不住直接转换也行
        return list.stream().mapToInt(Integer::intValue).toArray();
    }

    // 202. 快乐数
    public boolean isHappy(int n) {
        if (n == 1) return true;
        HashSet<Integer> hashSet = new HashSet<>();
        while (n != 1) {
            if (hashSet.contains(n))
                return false;
            hashSet.add(n);
            int newN = 0;
            while (n > 0) {
                int temp = n % 10;
                newN += temp * temp;
                n /= 10;
            }
            n = newN;
        }
        return true;
    }

    // 1. 两数之和
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        int len = nums.length;
        for (int i = 0; i < len; i++) {
            int num = nums[i];
            if (hashMap.containsKey(target - num)) {
                return new int[]{i, hashMap.get(target - num)};
            }
            hashMap.put(num, i);
        }
        return null;
    }
}
